/**
 * 36. 有效的数独
 * 
 * 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。
 * 数字 1-9 在每一行只能出现一次。
 * 数字 1-9 在每一列只能出现一次。
 * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。（请参考示例图T36）
 * 数独部分空格内已填入了数字，空白格用 '.' 表示。
 * 
 * 注意：
 * 一个有效的数独（部分已被填充）不一定是可解的。
 * 只需要根据以上规则，验证已经填入的数字是否有效即可。
 * 
 * 示例 1：
 * 输入：board = 
 * [["5","3",".",".","7",".",".",".","."]
 * ,["6",".",".","1","9","5",".",".","."]
 * ,[".","9","8",".",".",".",".","6","."]
 * ,["8",".",".",".","6",".",".",".","3"]
 * ,["4",".",".","8",".","3",".",".","1"]
 * ,["7",".",".",".","2",".",".",".","6"]
 * ,[".","6",".",".",".",".","2","8","."]
 * ,[".",".",".","4","1","9",".",".","5"]
 * ,[".",".",".",".","8",".",".","7","9"]]
 * 输出：true
 * 
 * 示例 2：
 * 输入：board = 
 * [["8","3",".",".","7",".",".",".","."]
 * ,["6",".",".","1","9","5",".",".","."]
 * ,[".","9","8",".",".",".",".","6","."]
 * ,["8",".",".",".","6",".",".",".","3"]
 * ,["4",".",".","8",".","3",".",".","1"]
 * ,["7",".",".",".","2",".",".",".","6"]
 * ,[".","6",".",".",".",".","2","8","."]
 * ,[".",".",".","4","1","9",".",".","5"]
 * ,[".",".",".",".","8",".",".","7","9"]]
 * 输出：false
 * 解释：除了第一行的第一个数字从 5 改为 8 以外，空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
 * 
 * 提示：
 * board.length == 9
 * board[i].length == 9
 * board[i][j] 是一位数字或者 '.'
 * 
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/valid-sudoku
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

package zw;

class T36 {
	public static boolean isValidSudoku(char[][] board) {
		char[] temp;
		// 判断每一行是否有重复数字
		for(int i = 0; i < 9; i++) {
			temp = new char[] {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
			for(int j = 0; j < 9; j++) {
				if(board[i][j] == '.') {
					continue;
				}
				if(temp[board[i][j] - '1'] == '0') {
					return false;
				} else {
					temp[board[i][j] - '1'] = '0';
				}
			}
		}
		
		// 判断每一列是否有重复数字
		for(int i = 0; i < 9; i++) {
			temp = new char[] {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
			for(int j = 0; j < 9; j++) {
				if(board[j][i] == '.') {
					continue;
				}
				if(temp[board[j][i] - '1'] == '0') {
					return false;
				} else {
					temp[board[j][i] - '1'] = '0';
				}
			}
		}
		
		//判断方格中是否有重复数字
		for(int r = 0; r < 3; r++) {
			for(int c = 0; c < 3; c++) {
				temp = new char[] {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
				for(int i = 0; i < 3; i++) {
					for(int j = 0; j < 3; j++) {
						if(board[i + 3*c][j + 3*r] == '.') {
							continue;
						}
						if (temp[board[i + 3*c][j + 3*r] -'0'] == '0') {
							return false;
						} else {
							temp[board[i + 3*c][j + 3*r] -'0'] = '0';
						}
					}
				}
			}
		}
		
		return true;
    }
}
